package com.itheima.proxydemo1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理工具类：负责创建代理对象并返回给调用者使用
 */
public class ProxyUtil {
    // 创建一个明星对象的代理对象并返回
    public static StarService createProxy(Star star){

        /**
         * 参数一：ClassLoader，类加载器，用于加载生成的代理类
         * 参数二：目标对象实现的接口数组，用于指定代理类需要实现哪些接口
         * 参数三：InvocationHandler，用于指定代理类如何去代理（要做的事情）
         */
        StarService proxy = (StarService) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),
                star.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //用来声明代理对象要完成的事情
                        //参数一：proxy，接收到的代理对象
                        //参数二：method，正在被代理的方法
                        //参数三：args，正在被代理的方法的参数
                        String methodName = method.getName();
                        if ("dance".equals(methodName)){
                            System.out.println("收钱10万，准备话筒！");
                        }else if ("sing".equals(methodName)){
                            System.out.println("收钱20万，准备场地！");
                        }
                        //找到目标对象要调用的方法，并调用
                        //找明星对象来执行被代理的行为：method方法
                        Object res = method.invoke(star, args);
                        return res;
                    }
                }
        );
        return proxy;
    }
}
